home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / game / shoot / ADescentSrc.lha / descent / main / powerup.c < prev    next >
C/C++ Source or Header  |  1998-08-08  |  18KB  |  589 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /*
  14.  * $Source: /usr/CVS/descent/main/powerup.c,v $
  15.  * $Revision: 1.2 $
  16.  * $Author: nobody $
  17.  * $Date: 1998/08/08 15:45:25 $
  18.  * 
  19.  * Code for powerup objects.
  20.  * 
  21.  * $Log: powerup.c,v $
  22.  * Revision 1.2  1998/08/08 15:45:25  nobody
  23.  * Activated the Editior
  24.  *
  25.  * Revision 1.1.1.1  1998/03/03 15:12:30  nobody
  26.  * reimport after crash from backup
  27.  *
  28.  * Revision 1.1.1.1  1998/02/13  20:21:03  hfrieden
  29.  * Initial Import
  30.  *
  31.  * Revision 2.2  1995/03/24  13:50:36  john
  32.  * Added mega-wowie zowie to release.
  33.  * 
  34.  * Revision 2.1  1995/03/21  14:38:39  john
  35.  * Ifdef'd out the NETWORK code.
  36.  * 
  37.  * Revision 2.0  1995/02/27  11:27:15  john
  38.  * New version 2.0, which has no anonymous unions, builds with
  39.  * Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
  40.  * 
  41.  * Revision 1.94  1995/02/22  13:46:03  allender
  42.  * remove anonymous unions from object structure
  43.  * 
  44.  * Revision 1.93  1995/02/06  15:52:51  mike
  45.  * add mini megawow powerup for giving reasonable weapons.
  46.  * 
  47.  * Revision 1.92  1995/01/23  22:49:59  mike
  48.  * drop energy instead of primary weapon if you have primary weapon
  49.  * (drop nothing if want to drop vulcan ammo and you are maxed out)
  50.  * if you have primary weapon and primary weapon there, get energy instead.
  51.  * 
  52.  * Revision 1.91  1995/01/19  09:42:22  allender
  53.  * record laser levels for demos
  54.  * 
  55.  * Revision 1.90  1994/12/31  12:28:01  rob
  56.  * Added sound for coop key grabs.
  57.  * 
  58.  * Revision 1.89  1994/12/19  19:55:17  rob
  59.  * Fixing key semantics for coop game.
  60.  * 
  61.  * Revision 1.88  1994/12/07  12:55:21  mike
  62.  * tweak vulcan amounts.
  63.  * 
  64.  * Revision 1.87  1994/12/06  13:55:36  matt
  65.  * Made shield & energy powerup messages round to match HUD message
  66.  * 
  67.  * Revision 1.86  1994/12/03  19:03:57  matt
  68.  * Fixed vulcan ammo HUD message
  69.  * 
  70.  * Revision 1.85  1994/11/29  11:35:41  rob
  71.  * Added sound casting for grabbing powerups.
  72.  * 
  73.  * Revision 1.84  1994/11/28  11:26:38  matt
  74.  * Cleaned up hud message printing for picking up weapons
  75.  * 
  76.  * Revision 1.83  1994/11/27  23:14:01  matt
  77.  * Made changes for new mprintf calling convention
  78.  * 
  79.  * Revision 1.82  1994/11/21  16:02:51  mike
  80.  * comment out unused powerups.
  81.  * 
  82.  * Revision 1.81  1994/11/20  18:25:47  john
  83.  * Fixed some #ifndef RELEASE inconsistancies.
  84.  * 
  85.  * Revision 1.80  1994/11/19  23:54:13  mike
  86.  * limit megawowiezowie to shareware powerups if in shareware version.
  87.  * 
  88.  * Revision 1.79  1994/11/14  16:06:16  yuan
  89.  * Made cloak and invulnerability only picked up once.
  90.  * 
  91.  * Revision 1.78  1994/11/07  17:41:06  mike
  92.  * messages for when you're fully stocked with missiles.
  93.  * 
  94.  * Revision 1.77  1994/10/28  14:42:50  john
  95.  * Added sound volumes to all sound calls.
  96.  * 
  97.  * Revision 1.76  1994/10/26  15:55:23  yuan
  98.  * Made vulcan cannon give 100 ammo if it has less than that.
  99.  * 
  100.  * Revision 1.75  1994/10/26  15:54:57  yuan
  101.  * *** empty log message ***
  102.  * 
  103.  * Revision 1.74  1994/10/25  14:31:25  allender
  104.  * Fixed bug where getting cloak powerup while cloaked resulted in
  105.  * player being cloaked forever.
  106.  * 
  107.  * Revision 1.73  1994/10/25  10:51:21  matt
  108.  * Vulcan cannon powerups now contain ammo count
  109.  * 
  110.  * Revision 1.72  1994/10/21  20:41:32  mike
  111.  * Fix silly backwards (- instead of +) bug in invulnerability powerup.
  112.  * 
  113.  * Revision 1.71  1994/10/20  09:49:23  mike
  114.  * Fix up powerups in some way.
  115.  * 
  116.  * Revision 1.70  1994/10/19  11:16:25  mike
  117.  * Limit amount of each type of ammo player can hold.
  118.  * 
  119.  * Revision 1.69  1994/10/17  14:12:11  matt
  120.  * Added sound for powerup disappearance effect
  121.  * 
  122.  * Revision 1.68  1994/10/17  14:07:04  mike
  123.  * Make shields and energy max out at 200.
  124.  * 
  125.  * Revision 1.67  1994/10/16  12:43:37  mike
  126.  * Don't allow you to pick up a primary weapon, or invulnerability, you already have.
  127.  * Make cloak time additive.
  128.  * 
  129.  * Revision 1.66  1994/10/15  19:05:30  mike
  130.  * Define constants for vulcan ammo amounts.
  131.  * 
  132.  * Revision 1.65  1994/10/14  15:57:28  mike
  133.  * When you pick up a laser boost or quad_laser powerup, update weapon display.
  134.  * 
  135.  * Revision 1.64  1994/10/13  10:57:51  adam
  136.  * fiddled with powerup disappearance
  137.  * 
  138.  * Revision 1.63  1994/10/12  13:07:33  mike
  139.  * Make powerup play vclip when it goes away.
  140.  * 
  141.  * Revision 1.62  1994/10/12  08:04:42  mike
  142.  * Make proximity powerup worth 4 bombs.
  143.  * 
  144.  * Revision 1.61  1994/10/08  23:37:33  matt
  145.  * Don't pick up weapons you already have; also fixed auto_select bug
  146.  * for seconary weapons
  147.  * 
  148.  * Revision 1.60  1994/10/08  15:41:00  mike
  149.  * Diminish palette effect due to powerups.
  150.  * 
  151.  * Revision 1.59  1994/10/07  23:37:45  matt
  152.  * Made weapons select when pick up better one
  153.  * 
  154.  * Revision 1.58  1994/10/07  22:09:20  rob
  155.  * Added network hook for grabbing the cloaking device.
  156.  *
  157.  */
  158.  
  159.  
  160. #pragma off (unreferenced)
  161. static char rcsid[] = "$Id: powerup.c,v 1.2 1998/08/08 15:45:25 nobody Exp $";
  162. #pragma on (unreferenced)
  163.  
  164. #include <stdarg.h>
  165. #include <stdio.h>
  166. #include <string.h>
  167.  
  168. #include "3d.h"
  169. #include "mono.h"
  170.  
  171. #include "inferno.h"
  172. #include "object.h"
  173. #include "game.h"
  174.  
  175. #include "fireball.h"
  176. #include "powerup.h"
  177. #include "gauges.h"
  178.  
  179. #include "sounds.h"
  180. #include "player.h"
  181.  
  182. #include "wall.h"
  183. #include "text.h"
  184. #include "weapon.h"
  185. #include "laser.h"
  186. #include "scores.h"
  187. #include "multi.h"
  188.  
  189. #include "newdemo.h"
  190.  
  191. #ifdef EDITOR
  192. #include "gr.h" //  for powerup outline drawing
  193. #include "editor/editor.h"
  194. #endif
  195.  
  196. #define ENERGY_MAX  i2f(200)
  197. #define SHIELD_MAX  i2f(200)
  198.  
  199. int N_powerup_types = 0;
  200. powerup_type_info Powerup_info[MAX_POWERUP_TYPES];
  201.  
  202. //process this powerup for this frame
  203. void do_powerup_frame(object *obj)
  204. {
  205.     vclip_info *vci = &obj->rtype.vclip_info;
  206.     vclip *vc = &Vclip[vci->vclip_num];
  207.  
  208.     vci->frametime -= FrameTime;
  209.     
  210.     while (vci->frametime < 0 ) {
  211.  
  212.         vci->frametime += vc->frame_time;
  213.         
  214.         vci->framenum++;
  215.         if (vci->framenum >= vc->num_frames)
  216.             vci->framenum=0;
  217.     }
  218.  
  219.     if (obj->lifeleft <= 0) {
  220.         object_create_explosion(obj->segnum, &obj->pos, fl2f(3.5), VCLIP_POWERUP_DISAPPEARANCE );
  221.  
  222.         if ( Vclip[VCLIP_POWERUP_DISAPPEARANCE].sound_num > -1 )
  223.             digi_link_sound_to_object( Vclip[VCLIP_POWERUP_DISAPPEARANCE].sound_num, obj-Objects, 0, F1_0);
  224.     }
  225. }
  226.  
  227. #ifdef EDITOR
  228. extern fix blob_vertices[];
  229.  
  230. //  blob_vertices has 3 vertices in it, 4th must be computed
  231. void draw_blob_outline(void)
  232. {
  233.     fix v3x, v3y;
  234.  
  235.     v3x = blob_vertices[4] - blob_vertices[2] + blob_vertices[0];
  236.     v3y = blob_vertices[5] - blob_vertices[3] + blob_vertices[1];
  237.  
  238.     gr_setcolor(BM_XRGB(63, 63, 63));
  239.  
  240.     mprintf((0, "[%7.3f %7.3f]  [%7.3f %7.3f]  [%7.3f %7.3f]\n", f2fl(blob_vertices[0]), f2fl(blob_vertices[1]), f2fl(blob_vertices[2]), f2fl(blob_vertices[3]), f2fl(blob_vertices[4]), f2fl(blob_vertices[5]) ));
  241.  
  242.     gr_line(blob_vertices[0], blob_vertices[1], blob_vertices[2], blob_vertices[3]);
  243.     gr_line(blob_vertices[2], blob_vertices[3], blob_vertices[4], blob_vertices[5]);
  244.     gr_line(blob_vertices[4], blob_vertices[5], v3x, v3y);
  245.  
  246.     gr_line(v3x, v3y, blob_vertices[0], blob_vertices[1]);
  247. }
  248. #endif
  249.  
  250. void draw_powerup(object *obj)
  251. {
  252.     #ifdef EDITOR
  253.     blob_vertices[0] = 0x80000;
  254.     #endif
  255.  
  256.     draw_object_blob(obj, Vclip[obj->rtype.vclip_info.vclip_num].frames[obj->rtype.vclip_info.framenum] );
  257.  
  258.     #ifdef EDITOR
  259.     if ((Function_mode == FMODE_EDITOR) && (Cur_object_index == obj-Objects))
  260.         if (blob_vertices[0] != 0x80000)
  261.             draw_blob_outline();
  262.     #endif
  263.  
  264. }
  265.  
  266. //void mprintf_powerup_info(void)
  267. //{
  268. //  int     i;
  269. //mprintf((0, "Powerup: %s\n", text));
  270. //for (i=0; i<5; i++) {
  271. //  char    has_text[12];
  272. //
  273. //  if (Players[Player_num].primary_weapon_flags & (1 << i))
  274. //      strcpy(has_text,"PRESENT");
  275. //  else
  276. //      strcpy(has_text,"NOPE   ");
  277. //  has_text[8] = 0;
  278. //
  279. //  mprintf((0, "Weapon %i = %s, ammo = %6i, name = %s\n", i, has_text, Players[Player_num].primary_ammo[i], Primary_weapon_names[i]));
  280. //}
  281. //
  282. //for (i=0; i<5; i++) {
  283. //  char    has_text[12];
  284. //
  285. //  if (Players[Player_num].secondary_weapon_flags & (1 << i))
  286. //      strcpy(has_text,"PRESENT");
  287. //  else
  288. //      strcpy(has_text,"NOPE   ");
  289. //
  290. //  mprintf((0, "Weapon %i = %s, ammo = %6i, name = %s\n", i, has_text, Players[Player_num].secondary_ammo[i], Secondary_weapon_names[i]));
  291. //}
  292. //}
  293.  
  294. powerup_basic(int redadd, int greenadd, int blueadd, int score, char *format, ...)
  295. {
  296.     char        text[120];
  297.     va_list args;
  298.  
  299.     va_start(args, format );
  300.     vsprintf(text, format, args);
  301.     va_end(args);
  302.  
  303.     PALETTE_FLASH_ADD(redadd,greenadd,blueadd);
  304.  
  305.     HUD_init_message(text);
  306.  
  307.     //mprintf_powerup_info();
  308.  
  309.     add_points_to_score(score);
  310.  
  311. }
  312.  
  313. //#ifndef RELEASE
  314. //  Give the megawow powerup!
  315. void do_megawow_powerup(int quantity)
  316. {
  317.     int i;
  318.  
  319.     powerup_basic(30, 0, 30, 1, "MEGA-WOWIE-ZOWIE!");
  320. #ifndef SHAREWARE
  321.     Players[Player_num].primary_weapon_flags = 0xff;
  322.     Players[Player_num].secondary_weapon_flags = 0xff;
  323. #else
  324.     Players[Player_num].primary_weapon_flags = 0xff ^ (HAS_PLASMA_FLAG | HAS_FUSION_FLAG);
  325.     Players[Player_num].secondary_weapon_flags = 0xff ^ (HAS_SMART_FLAG | HAS_MEGA_FLAG);
  326. #endif
  327.     for (i=0; i<3; i++)
  328.         Players[Player_num].primary_ammo[i] = 200;
  329.  
  330.     for (i=0; i<3; i++)
  331.         Players[Player_num].secondary_ammo[i] = quantity;
  332.  
  333. #ifndef SHAREWARE
  334.     for (i=3; i<5; i++)
  335.         Players[Player_num].primary_ammo[i] = 200;
  336.  
  337.     for (i=3; i<5; i++)
  338.         Players[Player_num].secondary_ammo[i] = quantity/5;
  339. #endif
  340.  
  341.     if (Newdemo_state == ND_STATE_RECORDING)
  342.         newdemo_record_laser_level(Players[Player_num].laser_level, MAX_LASER_LEVEL);
  343.  
  344.     Players[Player_num].energy = F1_0*200;
  345.     Players[Player_num].shields = F1_0*200;
  346.     Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS;
  347.     Players[Player_num].laser_level = MAX_LASER_LEVEL;
  348.     update_laser_weapon_info();
  349.  
  350. }
  351. //#endif
  352.  
  353. int pick_up_energy(void)
  354. {
  355.     int used=0;
  356.  
  357.     if (Players[Player_num].energy < ENERGY_MAX) {
  358.         Players[Player_num].energy += 3*F1_0 + 3*F1_0*(NDL - Difficulty_level);
  359.         if (Players[Player_num].energy > ENERGY_MAX)
  360.             Players[Player_num].energy = ENERGY_MAX;
  361.         powerup_basic(15,15,7, ENERGY_SCORE, "%s %s %d",TXT_ENERGY,TXT_BOOSTED_TO,f2ir(Players[Player_num].energy));
  362.         used=1;
  363.     } else
  364.         HUD_init_message(TXT_MAXED_OUT,TXT_ENERGY);
  365.  
  366.     return used;
  367. }
  368.  
  369. int pick_up_vulcan_ammo(void)
  370. {
  371.     int used=0;
  372.  
  373.     int pwsave = Primary_weapon;        // Ugh, save selected primary weapon around the picking up of the ammo.  I apologize for this code.  Matthew A. Toschlog
  374.     if (pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, VULCAN_AMMO_AMOUNT)) {
  375.         powerup_basic(7, 14, 21, VULCAN_AMMO_SCORE, "%s!", TXT_VULCAN_AMMO);
  376.         used = 1;
  377.     } else {
  378.         HUD_init_message("%s %d %s!",TXT_ALREADY_HAVE,f2i(VULCAN_AMMO_SCALE * Primary_ammo_max[VULCAN_INDEX]),TXT_VULCAN_ROUNDS);
  379.         used = 0;
  380.     }
  381.     Primary_weapon = pwsave;
  382.  
  383.     return used;
  384. }
  385.  
  386. //  returns true if powerup consumed
  387. int do_powerup(object *obj)
  388. {
  389.     int used=0;
  390.     int vulcan_ammo_to_add_with_cannon;
  391.  
  392.     if ((Player_is_dead) || (ConsoleObject->type == OBJ_GHOST))
  393.         return 0;
  394.  
  395.     switch (obj->id) {
  396.         case POW_EXTRA_LIFE:
  397.             Players[Player_num].lives++;
  398.             powerup_basic(15, 15, 15, 0, TXT_EXTRA_LIFE);
  399.             used=1;
  400.             break;
  401.         case POW_ENERGY:
  402.             used = pick_up_energy();
  403.             break;
  404.         case POW_SHIELD_BOOST:
  405.             if (Players[Player_num].shields < SHIELD_MAX) {
  406.                 Players[Player_num].shields += 3*F1_0 + 3*F1_0*(NDL - Difficulty_level);
  407.                 if (Players[Player_num].shields > SHIELD_MAX)
  408.                     Players[Player_num].shields = SHIELD_MAX;
  409.                 powerup_basic(0, 0, 15, SHIELD_SCORE, "%s %s %d",TXT_SHIELD,TXT_BOOSTED_TO,f2ir(Players[Player_num].shields));
  410.                 used=1;
  411.             } else
  412.                 HUD_init_message(TXT_MAXED_OUT,TXT_SHIELD);
  413.             break;
  414.         case POW_LASER:
  415.             if (Players[Player_num].laser_level >= MAX_LASER_LEVEL) {
  416.                 Players[Player_num].laser_level = MAX_LASER_LEVEL;
  417.                 HUD_init_message(TXT_MAXED_OUT,TXT_LASER);
  418.             } else {
  419.                 if (Newdemo_state == ND_STATE_RECORDING)
  420.                     newdemo_record_laser_level(Players[Player_num].laser_level, Players[Player_num].laser_level + 1);
  421.                 Players[Player_num].laser_level++;
  422.                 powerup_basic(10, 0, 10, LASER_SCORE, "%s %s %d",TXT_LASER,TXT_BOOSTED_TO, Players[Player_num].laser_level+1);
  423.                 update_laser_weapon_info();
  424.                 used=1;
  425.             }
  426.             if (!used && !(Game_mode & GM_MULTI) )
  427.                 used = pick_up_energy();
  428.             break;
  429.         case POW_MISSILE_1:
  430.             used=pick_up_secondary(CONCUSSION_INDEX,1);
  431.             break;
  432.         case POW_MISSILE_4:
  433.             used=pick_up_secondary(CONCUSSION_INDEX,4);
  434.             break;
  435.  
  436.         case POW_KEY_BLUE:
  437.             if (Players[Player_num].flags & PLAYER_FLAGS_BLUE_KEY)
  438.                 break;
  439.             #ifdef NETWORK
  440.             multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
  441.             #endif
  442.             digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
  443.             Players[Player_num].flags |= PLAYER_FLAGS_BLUE_KEY;
  444.             powerup_basic(0, 0, 15, KEY_SCORE, "%s %s",TXT_BLUE,TXT_ACCESS_GRANTED);
  445.             if (Game_mode & GM_MULTI)
  446.                 used=0;
  447.             else
  448.                 used=1;
  449.             break;
  450.         case POW_KEY_RED:
  451.             if (Players[Player_num].flags & PLAYER_FLAGS_RED_KEY)
  452.                 break;
  453.             #ifdef NETWORK
  454.             multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
  455.             #endif
  456.             digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
  457.             Players[Player_num].flags |= PLAYER_FLAGS_RED_KEY;
  458.             powerup_basic(15, 0, 0, KEY_SCORE, "%s %s",TXT_RED,TXT_ACCESS_GRANTED);
  459.             if (Game_mode & GM_MULTI)
  460.                 used=0;
  461.             else
  462.                 used=1;
  463.             break;
  464.         case POW_KEY_GOLD:
  465.             if (Players[Player_num].flags & PLAYER_FLAGS_GOLD_KEY)
  466.                 break;
  467.             #ifdef NETWORK
  468.             multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
  469.             #endif
  470.             digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
  471.             Players[Player_num].flags |= PLAYER_FLAGS_GOLD_KEY;
  472.             powerup_basic(15, 15, 7, KEY_SCORE, "%s %s",TXT_YELLOW,TXT_ACCESS_GRANTED);
  473.             if (Game_mode & GM_MULTI)
  474.                 used=0;
  475.             else
  476.                 used=1;
  477.             break;
  478.         case POW_QUAD_FIRE:
  479.             if (!(Players[Player_num].flags & PLAYER_FLAGS_QUAD_LASERS)) {
  480.                 Players[Player_num].flags |= PLAYER_FLAGS_QUAD_LASERS;
  481.                 powerup_basic(15, 15, 7, QUAD_FIRE_SCORE, "%s!",TXT_QUAD_LASERS);
  482.                 update_laser_weapon_info();
  483.                 used=1;
  484.             } else
  485.                 HUD_init_message("%s %s!",TXT_ALREADY_HAVE,TXT_QUAD_LASERS);
  486.             if (!used && !(Game_mode & GM_MULTI) )
  487.                 used = pick_up_energy();
  488.             break;
  489.         case    POW_VULCAN_WEAPON:
  490.             if ((used = pick_up_primary(VULCAN_INDEX)) != 0) {
  491.                 vulcan_ammo_to_add_with_cannon = obj->ctype.powerup_info.count;
  492.                 if (vulcan_ammo_to_add_with_cannon < VULCAN_WEAPON_AMMO_AMOUNT) vulcan_ammo_to_add_with_cannon = VULCAN_WEAPON_AMMO_AMOUNT;
  493.                 pick_up_ammo(CLASS_PRIMARY, VULCAN_INDEX, vulcan_ammo_to_add_with_cannon);
  494.             }
  495.             if (!used)
  496.                 used = pick_up_vulcan_ammo();
  497.             break;
  498.         case    POW_SPREADFIRE_WEAPON:
  499.             used = pick_up_primary(SPREADFIRE_INDEX);
  500.             if (!used && !(Game_mode & GM_MULTI) )
  501.                 used = pick_up_energy();
  502.             break;
  503.         case    POW_PLASMA_WEAPON:
  504.             used = pick_up_primary(PLASMA_INDEX);
  505.             if (!used && !(Game_mode & GM_MULTI) )
  506.                 used = pick_up_energy();
  507.             break;
  508.         case    POW_FUSION_WEAPON:
  509.             used = pick_up_primary(FUSION_INDEX);
  510.             if (!used && !(Game_mode & GM_MULTI) )
  511.                 used = pick_up_energy();
  512.             break;
  513.  
  514.         case    POW_PROXIMITY_WEAPON:
  515.             used=pick_up_secondary(PROXIMITY_INDEX,4);
  516.             break;
  517.         case    POW_SMARTBOMB_WEAPON:
  518.             used=pick_up_secondary(SMART_INDEX,1);
  519.             break;
  520.         case    POW_MEGA_WEAPON:
  521.             used=pick_up_secondary(MEGA_INDEX,1);
  522.             break;
  523.         case    POW_VULCAN_AMMO: {
  524.             used = pick_up_vulcan_ammo();
  525.             if (!used && !(Game_mode & GM_MULTI) )
  526.                 used = pick_up_vulcan_ammo();
  527.             break;
  528.         }
  529.             break;
  530.         case    POW_HOMING_AMMO_1:
  531.             used=pick_up_secondary(HOMING_INDEX,1);
  532.             break;
  533.         case    POW_HOMING_AMMO_4:
  534.             used=pick_up_secondary(HOMING_INDEX,4);
  535.             break;
  536.         case    POW_CLOAK:
  537.             if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) {
  538.                 HUD_init_message("%s %s!",TXT_ALREADY_ARE,TXT_CLOAKED);
  539.                 break;
  540.             } else {
  541.                 Players[Player_num].cloak_time = GameTime;  //  Not! changed by awareness events (like player fires laser).
  542.                 Players[Player_num].flags |= PLAYER_FLAGS_CLOAKED;
  543.                 ai_do_cloak_stuff();
  544.                 #ifdef NETWORK
  545.                 if (Game_mode & GM_MULTI)
  546.                     multi_send_cloak();
  547.                 #endif
  548.                 powerup_basic(-10,-10,-10, CLOAK_SCORE, "%s!",TXT_CLOAKING_DEVICE);
  549.                 used = 1;
  550.                 break;
  551.             }
  552.         case    POW_INVULNERABILITY:
  553.             if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE) {
  554.                 HUD_init_message("%s %s!",TXT_ALREADY_ARE,TXT_INVULNERABLE);
  555.                 break;
  556.             } else {
  557.                 Players[Player_num].invulnerable_time = GameTime;
  558.                 Players[Player_num].flags |= PLAYER_FLAGS_INVULNERABLE;
  559.                 powerup_basic(7, 14, 21, INVULNERABILITY_SCORE, "%s!",TXT_INVULNERABILITY);
  560.                 used = 1;
  561.                 break;
  562.             }
  563.     #ifndef RELEASE
  564.         case    POW_MEGAWOW:
  565.             do_megawow_powerup(50);
  566.             used = 1;
  567.             break;
  568.     #endif
  569.  
  570.         default:
  571.             break;
  572.         }
  573.  
  574. //always say used, until physics problem (getting stuck on unused powerup)
  575. //is solved.  Note also the break statements above that are commented out
  576. //!!    used=1;
  577.  
  578.     if (used && Powerup_info[obj->id].hit_sound  > -1 ) {
  579.         #ifdef NETWORK
  580.         if (Game_mode & GM_MULTI) // Added by Rob, take this out if it turns out to be not good for net games!
  581.             multi_send_play_sound(Powerup_info[obj->id].hit_sound, F1_0);
  582.         #endif
  583.         digi_play_sample( Powerup_info[obj->id].hit_sound, F1_0 );
  584.     }
  585.  
  586.     return used;
  587.  
  588. }
  589.